package kr.co.bettersoft.pushchat.activity;

import kr.co.bettersoft.pushchat.common.CommonConstant;
import kr.co.bettersoft.pushchat.common.PushChatRest;
import kr.co.bettersoft.pushchat.domain.ChatMember;
import kr.co.bettersoft.pushchat.domain.PushChatMember;
import kr.co.bettersoft.pushchat.fragment.FragmentHome;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
 * 로그인 화면.
 *  아이디, 비번을 입력받아 로그인한다.
 * @author blue
 *
 */
public class LoginActivity extends Activity{
	/////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수

	String TAG = "LoginActivity";

	public final int LOGIN = 101;		// 로그인한다.

	// 로그인용 아이디, 비번 값
	String userId = "";
	String password = "";

	// 서버 호출용
	Boolean loading = false;
	PushChatRest pushChatRest;
	String callResult = "";	// 서버 호출 결과

	// 전달받은 값
	Intent receivedIntent;
	String runMode = "";
	static String receivedChatRoomId = "";
	static String receivedChatRoomOwner = "";
	static String receivedUserId = "";

	SharedPreferences sharedPrefCustom;	// 공용 프립스	

	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;
	InputMethodManager imm;

	// 화면 구성 					 
	Button loginBtn;		//	 로그인버튼
	TextView idText, pwText;		//아이디/비번입력창
	CheckBox checkAutoLogin; // 자동 로그인 체크	login_auto_login_check
	ProgressBar pb1;		// 중단 로딩 진행바

	//////////////////////////////////////////////////////////////////////////////////////////////////////	


	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("showToast")==1){		// 화면에 토스트 띄우기. 띄우는 문구는 msg 로 받은 값
					Toast.makeText(LoginActivity.this, b.getString("msg"), Toast.LENGTH_SHORT).show();
				}
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("initLogin")==1){		// 화면 로그인 정보 초기화 하기
					idText.setText("");
					pwText.setText("");
				}
				if(b.getInt("loginEnable")==1){				// 화면 로그인 버튼 사용 가능
					loginBtn.setEnabled(true);
				}else if(b.getInt("loginEnable")==2){		// 화면 로그인 버튼 사용 불가
					loginBtn.setEnabled(false);
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.login_page_progressbar1);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.login_page_progressbar1);
					}
					pb1.setVisibility(View.INVISIBLE);
				}

				switch (msg.what)
				{
				case LOGIN : runOnUiThread(new RunnableLogin());				
				break;
				default : 
					break;
				}



			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.login_activity);
		Log.w(TAG,"LoginActivity onCreate");

		// 프립
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);

		pushChatRest = new PushChatRest();

		// 어플 실행중
		SharedPreferences.Editor saveChatRoomStatusPref = sharedPrefCustom.edit();
		saveChatRoomStatusPref.putBoolean("appRunningYn", true);			   		// 채팅방 사용중. (푸시를 통한 리프레시 기능을 위해 필요)	
		saveChatRoomStatusPref.commit();
		//			CommonConstant.appRunningYn = true;

		// 전달 받은 값
		receivedIntent = getIntent();
		runMode = receivedIntent.getStringExtra("RunMode");
		receivedChatRoomId = receivedIntent.getStringExtra("chatRoomId");
		receivedChatRoomOwner = receivedIntent.getStringExtra("chatRoomOwner");
		receivedUserId = receivedIntent.getStringExtra("userId");
		if(runMode==null){
			runMode = "";
		}
		if(receivedChatRoomId==null){
			receivedChatRoomId = "";
		}
		if(receivedChatRoomOwner==null){
			receivedChatRoomOwner = "";
		}
		if(receivedUserId==null){
			receivedUserId = "";
		}

		// 레이아웃의 개체들을 가져와서 사용
		loginBtn = (Button) findViewById(R.id.login_btn);
		idText = (TextView) findViewById(R.id.login_id_text);
		pwText = (TextView) findViewById(R.id.login_pw_text);
		checkAutoLogin = (CheckBox) findViewById(R.id.login_auto_login_check);	// 자동 로그인 체크

		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도
		parentLayout = findViewById(R.id.login_page_parent_layout);			// 부모 레이아웃. 리스너 달아서 키보드 숨김에 사용
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.w(TAG,"parentLayout click");
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(idText.getWindowToken(), 0);
			}
		});
		// 버튼  리스너.
		loginBtn.setOnClickListener(new OnClickListener() {			// 로그인 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"loginBtn click");
				loginDisable();
				userId = idText.getText()+"";	 
				handler.sendEmptyMessage(LOGIN);
			}
		});

		// 자동 로그인 기능
		Boolean savedAutoLogin = sharedPrefCustom.getBoolean("autoLoginChecked",false);
		if(savedAutoLogin){

			userId = sharedPrefCustom.getString("autoLoginId", "");
			password = sharedPrefCustom.getString("autoLoginPw", "");

			if(userId.length()>0){
				checkAutoLogin.setChecked(savedAutoLogin);
				idText.setText(userId+"");
				pwText.setText(password+"");
				handler.sendEmptyMessage(LOGIN);
			}
		}

	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////

	public void goChatMain(){
		//				//아이디 저장하고 가기.
		SharedPreferences.Editor saveuserIdToPref = sharedPrefCustom.edit();
		saveuserIdToPref.putString("userId", userId);			// 로그인한 가맹점 아이디 저장   
		saveuserIdToPref.putString("userPassword", password);			// 로그인한 가맹점 아이디 저장   

		saveuserIdToPref.putString("autoLoginId", userId);	 		// ** 비번도 저장할 것
		saveuserIdToPref.putString("autoLoginPw", password);	 		// ** 비번도 저장할 것

		// 자동 로그인 설정에 따라 저장
		if(checkAutoLogin.isChecked()){
			saveuserIdToPref.putBoolean("autoLoginChecked", true);
		}

		// 로그인한 상태로 바꿈
		saveuserIdToPref.putString("loginYn", "Y");	
		// 채팅방 비사용중(초기화)
		saveuserIdToPref.putBoolean("chatRoomUsingYn", false);	

		saveuserIdToPref.commit();

		Intent i = new Intent(this, FragmentHome.class);
		i.putExtra("userId", userId);
		if(receivedUserId.equals(userId)){
			i.putExtra("chatRoomId", receivedChatRoomId);		
			i.putExtra("chatRoomOwner", receivedChatRoomOwner);	
		}
		//			CommonConstant.appRunningYn = false;		// 실행중 아님.
		startActivity(i);
		finish();
	}


	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * 러너블. 로그인
	 */
	class RunnableLogin implements Runnable {
		public void run(){
			new backgroundThreadLogin().execute();	
		}
	}
	/**
	 * backgroundThreadLogin
	 * 비동기  .  로그인한다
	 * @author blue
	 *
	 */
	public class backgroundThreadLogin extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadLogin");
			userId = idText.getText()+"";
			password = pwText.getText()+"";
			if(userId.length()<1){
				// 아이디 미입력
				showResultDialog(returnThis().getResources().getString(R.string.input_your_id));			// showMsg("아이디를 입력해 주십시오.");
				loading = false;
				loginEnable();
			}else if(password.length()<1){
				// 비번 미입력
				showResultDialog(returnThis().getResources().getString(R.string.input_your_pw));					// showMsg("비밀번호를 입력해 주십시오.");	
				loading = false;
				loginEnable();
			}else{
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);		// 키보드 숨김
				imm .hideSoftInputFromWindow(idText.getWindowToken(), 0);

				// 파라미터 셋팅
				PushChatMember pushChatMemberParam = new PushChatMember();
				pushChatMemberParam.setMemberId(userId);
				pushChatMemberParam.setPassword(password);
				// 서버 메소드 호출
				showPb();
				callResult = pushChatRest.RestLogin(pushChatMemberParam);
				// 결과 처리
				if(callResult.equals("0")){
					// 로그인 실패
					showResultDialog(returnThis().getResources().getString(R.string.login_failed));			
					loading = false;
					loginEnable();
				}else{	
					// 로그인 성공
					goChatMain();
				}
				// 화면의 아이디, 비번 입력창 초기화.....
				hidePb();
				initLogin();
			}
			return null; 
		}
	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 유틸	

	/**
	 * returnThis
	 *  컨택스트 반환한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}


	/*
	 * 핸들러 파트.
	 *  화면상의 변화가 있는 요청은 핸들러를 사용
	 */
	// 화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	/**
	 * showMsg
	 *  화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showMsg(final String msg){		
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showToast", 1);
				b.putString("msg", msg);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	/**
	 * showResultDialog
	 *   얼럿 띄운다
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showResultDialog(final String msg){
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	/**
	 * initLogin
	 * 아이디, 비번 초기화.  로그인 성공 또는 실패 이후 화면에 있던 로그인 정보를 초기화 한다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void initLogin(){			
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("initLogin", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	/**
	 * loginEnable
	 * 로그인 버튼 사용 가능 하게 한다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void loginEnable(){		
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("loginEnable", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	/**
	 * loginDisable
	 * 로그인 버튼 사용 불가로 만든다 (두번 눌리는것 방지)
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void loginDisable(){		
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("loginEnable", 2);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 

	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 1);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 2);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}

	/**
	 * onBackPressed
	 *  종료시 모두 종료시킨다. (홈갔다왔을때 용도)
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onBackPressed() {
		SharedPreferences.Editor appRunningYnPref = sharedPrefCustom.edit();
		appRunningYnPref.putBoolean("appRunningYn", false);		// 실행중 아님.
		appRunningYnPref.commit();
		android.os.Process.killProcess(android.os.Process.myPid());
		super.onBackPressed();
	}

}
